package com.lovely602.algorithm.leetcode.basicprogramming50;


import java.util.Arrays;

/**
 * 242. 有效的字母异位词
 * <p>
 * 给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的 字母异位词。
 * <p>
 * 示例 1:
 * <p>
 * 输入: s = "anagram", t = "nagaram"
 * 输出: true
 * <p>
 * 示例 2:
 * <p>
 * 输入: s = "rat", t = "car"
 * 输出: false
 * <p>
 * 提示:
 * <p>
 * 1 <= s.length, t.length <= 5 * 104
 * <p>
 * s 和 t 仅包含小写字母
 *
 * @author lizhixing
 */
public class Question04 {

    public static void main(String[] args) {
        String s = "qwerty1";
        String t = "ytrewq";
        Question04 question04 = new Question04();
        boolean isAnagramBySort = question04.isAnagramBySort(s, t);
        System.out.println("isAnagramBySort：" + isAnagramBySort);
        boolean isAnagramByHash = question04.isAnagramByHash(s, t);
        System.out.println("isAnagramByHash：" + isAnagramByHash);
    }

    /**
     * 方法一：排序
     * <p>
     * t 是 s 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 s 和 t 分别排序，看排序后的字符串是否相等即可判断。此外，如果 s 和 t 的长度不同，t 必然不是 s 的异位词。
     */
    public boolean isAnagramBySort(String s, String t) {

        if (s.length() != t.length()) {
            return false;
        }
        char[] sArr = s.toCharArray();
        char[] tArr = t.toCharArray();
        Arrays.sort(sArr);
        Arrays.sort(tArr);
        return Arrays.equals(sArr, tArr);

    }

    /**
     * 哈希表
     * <p>
     * 从另一个角度考虑，t 是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。
     * 由于字符串只包含 26 个小写字母，因此我们可以维护一个长度为 26 的频次数组 table，
     * 先遍历记录字符串 s 中字符出现的频次，然后遍历字符串 t，减去 table 中对应的频次，
     * 如果出现 table[i]<0，则说明 t 包含一个不在 s 中的额外字符，返回 false 即可。
     */
    public boolean isAnagramByHash(String s, String t) {

        if (s.length() != t.length()) {
            return false;
        }
        int[] table = new int[26];
        for (int i = 0; i < s.length(); i++) {
            table[s.charAt(i) - 'a']++;
        }

        for (int j = 0; j < t.length(); j++) {
            table[t.charAt(j) - 'a']--;
            if (table[t.charAt(j) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}
